package task

//一个task要实现的接口  此处定义之后  作为ITask类型传入的实例struct就必须实现这五个接口
type ITask interface {
	Execute() error
	CallBack(result *Result)
	GetTaskInfo() TaskInfo
	UpdatePercentage(percent int64) error //更新进度
	Cancel() error                        //定义出来   各task根据自己的实际情况选择实现
}

//用于描述一个task的信息  初始化时需要指定的
type TaskInfo struct {
	ID         string
	Name       string
	Comment    string
	Type       string
	Cancelable bool
}

// task is used in the task manage framework
type task struct {
	attemptCount         int     // 尝试次数
	maxRetryTimes        int     // 最大尝试次数
	baseRetryBackOffMs   int64   // 首次重试的退避时间
	maxRetryIntervalInMs int64   // 重试的最大退避时间，默认为 50 秒
	createTimeMs         int64   // 创建的时间
	nextRetryMs          int64   // 下次重试的时间
	result               *Result // 发送结果
	task                 ITask
}

// *************************
// task factory
type taskFactory struct {
	maxRetryTimes        int   // 最大尝试次数
	baseRetryBackOffMs   int64 // 首次重试的退避时间
	maxRetryIntervalInMs int64 // 重试的最大退避时间，默认为 50 秒
}

func newTaskFactory(c *Config) *taskFactory {
	return &taskFactory{
		maxRetryTimes:        c.MaxRetryTimes,
		baseRetryBackOffMs:   c.BaseRetryBackOffMs,
		maxRetryIntervalInMs: c.MaxRetryBackOffMs,
	}
}

func (taskFactory *taskFactory) produce(t ITask) *task {
	return &task{
		attemptCount:         0,
		maxRetryTimes:        taskFactory.maxRetryTimes,
		baseRetryBackOffMs:   taskFactory.baseRetryBackOffMs,
		maxRetryIntervalInMs: taskFactory.maxRetryIntervalInMs,
		createTimeMs:         getTimeMs(),
		nextRetryMs:          0,
		result:               initResult(t),
		task:                 t,
	}
}
